package com.example.exception;

import com.example.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Arrays;

/**
 * 全局异常处理器：统一处理 Controller 层抛出的异常
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理所有未被其他方法捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception ex) {
        // 打印完整的异常堆栈，便于调试定位
        ex.printStackTrace();

        // 使用 slf4j 记录日志，包含异常堆栈信息
        log.error("未知异常: ", ex);

        // 返回通用错误信息给前端
        return Result.error("系统异常，请联系管理员");
    }

    /**
     * 处理唯一键冲突（如数据库唯一约束失败）
     */
    @ExceptionHandler(DuplicateKeyException.class)
    public Result handleDuplicateKeyException(DuplicateKeyException ex) {
        log.error("唯一键冲突异常: ", ex);

        String message = ex.getMessage();
        int index = message.indexOf("Duplicate entry");
        if (index != -1) {
            String errMsg = message.substring(index);
            String[] parts = errMsg.split(" ");
            if (parts.length > 2) {
                return Result.error(parts[2] + "已存在");
            }
        }

        return Result.error("数据重复，请检查输入内容");
    }

    /**
     * 处理自定义业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public Result handleBusinessException(BusinessException ex) {
        log.warn("业务异常: {}", ex.getMessage());
        return Result.error(ex.getMessage());
    }
}